/********** 表达式 **********/
// 值的类型？
// Number, String, Boolean, null, undefined, Symbol
// Object, Array
false;
996;
332 * 3;
(78 - 2) / 4;
3 * (2 * 4 + (3 + 5)) + (10 - 7 + 6);

/********** 变量与环境 **********/
// 通过名字去「使用」计算对象
// why？减少重复 增加抽象 类比 x
// 谁有权使用？
// 变量命名规则？
const PI = 3.14;
let r = 3;
PI * r ** 2;
var cir = 2 * PI * r;

/********** 组合求值过程 **********/
// 树形结构 递归
(2 + 4 * 6) * (3 + 5 + 7);

/********** 定义过程本身：函数 **********/
// 声明函数的两种方式 函数声明和函数表达式
// 函数的两种形式 普通function和箭头函数
function square(x) {
  return x * x;
}

const sumOfSquares = (x, y) => square(x) + square(y);

const f = function f(n) {
  return sumOfSquares(n + 1, n * 2);
};

/********** 代换模型 **********/
// 有哪些可行的顺序？
// 应用序 和 正则序

/********** 条件语句、与或非 **********/
function abs(x) {
  if (x > 0) return x;
  if (x === 0) return 0;
  if (x < 0) return -x;
}

function absWithElse(x) {
  if (x < 0) return -x;
  else return x;
}

// 三元运算符
function absWithTernary(x) {
  return x < 0 ? -x : x;
}

// 注意顺序
function f2(x) {
  return (x > 0 && x <= 100) || !(x < 120);
}

/********** 黑箱与局部变量 **********/
function outer(x) {
  return inner(3);

  function inner(y) {
    return x + y;
  }
}

/********** 练习：牛顿法求平方根 **********/
// average(guess + (x / guess))
// 很小的数的平方根
function sqrt(x) {}

/********** 作业 **********/
/**
 * 给定任意数量的现金，计算出所有换零钱的方式
 * 零钱种类为 1元、2元、5元、10元
 * @param {number} n 总金额
 */
function changeCount(n) {}

const abc = {
  a: 1,
  b: 2,
  c: 3,
  d: {
    e: 99,
  },
};
const {
  a,
  b,
  c,
  d: { e },
} = abc;
console.log(e);
